package com.cby.juc.线程.RunnableAndCallable;

/**
 * ClassName: CallableDemo
 * Package: com.cby.juc.线程.RunnableAndCallable
 * Description:
 *
 * @Author dhu-bion
 * @Create 2025/9/12 16:26
 * @Version 1.0
 */
import java.util.concurrent.*;

public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 1. 定义Callable任务（有返回值Long，可抛Exception）
        Callable<Long> factorialTask = () -> {
            long sum = 1;
            for (int i = 1; i <= 10; i++) {
                sum *= i;
            }
            // 直接返回结果，无需手动存
            return sum;
        };

        // 2. 用线程池执行任务，返回Future（结果的"占位符"）
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<Long> future = executor.submit(factorialTask);

        // 3. 后续逻辑（可先做其他事，再获取结果）
        System.out.println("主线程先处理其他任务...");

        // 4. 获取结果（阻塞直到任务完成，可捕获异常）
        Long callableResult = future.get(); // get()会阻塞，直到call()执行完并返回
        System.out.println("Callable结果：" + callableResult); // 输出：3628800

        executor.shutdown();
    }
}
